Linux Commands
contents
리눅스의 핵심 철학은 "모든 것은 파일이다" 입니다. 실제 문서뿐만 아니라 프로세스, 하드웨어 장치, 네트워크 연결까지도 파일 시스템 내의 파일로 표현됩니다. 아래 명령어들은 이러한 "파일"들과 상호작용하기 위해 사용하는 도구입니다.
🐧 I. 프로세스 관리 및 모니터링
현재 실행 중인 작업을 확인하고 필요시 중지시킬 수 있습니다.
top/htop(실시간 모니터링)- 설명: 현재 실행 중인 모든 프로세스를 보여주는 실시간 대화형 대시보드입니다. 리눅스의 "작업 관리자"입니다.
- 사용법:
top을 입력합니다. (htop은 더 사용자 친화적이고 색상이 있는 버전이며,apt install htop으로 설치해야 할 수 있습니다.) - 주요 확인 항목:
%CPU: 프로세스가 사용하는 CPU 비율.%MEM: 프로세스가 사용하는 메모리(RAM) 비율.PID: 고유한 프로세스 ID.USER: 프로세스 소유자.S: 상태 (R = 실행 중, S = 유휴 상태, Z = 좀비).
top내부:k를 눌러 프로세스를 종료(PID를 물어봄)합니다.q를 눌러 종료합니다.
ps(스냅샷)- 설명:
top과 달리, 현재 프로세스들의 "스냅샷"을 찍어 한 번만 보여줍니다. - 주요 사용법:
ps auxa: 모든 사용자의 프로세스를 표시합니다.u: 사용자 중심의 포맷으로 표시합니다.x: 터미널에 연결되지 않은 프로세스(데몬 등)를 표시합니다.
- 팁: 특정 프로세스를 찾으려면
ps aux | grep [프로세스 이름]을 사용하세요. (예:ps aux | grep java)
- 설명:
kill(관리)- 설명: 프로세스를 종료시키기 위해 신호(signal)를 보냅니다.
- 사용법:
kill [PID] - 주요 신호:
kill [PID]:SIGTERM(신호 15)을 보냅니다. 종료하라는 "정중한" 요청입니다.kill -9 [PID]:SIGKILL(신호 9)을 보냅니다. 즉각적이고 차단 불가능한 종료 명령입니다. 프로세스가 멈췄을 때 사용합니다.
pkill(관리)- 설명: 프로세스 이름을 기반으로 종료시키는 유용한 유틸리티입니다.
- 사용법:
pkill -f [이름](예:pkill -f "java")
jobs,bg,fg,&(관리)&: 명령어 끝에 추가하면(예:./my_script.sh &) 백그라운드에서 실행합니다.ctrl+z: 현재 실행 중인 포그라운드 프로세스를 일시 중지합니다.jobs: 모든 백그라운드 또는 일시 중지된 작업을 나열합니다.bg: 일시 중지된 작업을 백그라운드에서 다시 시작합니다.fg: 백그라운드나 일시 중지된 작업을 포그라운드로 가져옵니다.
📁 II. 파일 및 디렉터리 관리
파일 시스템을 탐색하고 정리하기 위한 기본 명령어입니다.
ls(목록)- 설명: 디렉터리의 내용을 나열합니다.
- 주요 사용법:
ls -lah-l: 긴 포맷 (권한, 소유자, 크기, 날짜 표시).-a: 모든 파일 (.으로 시작하는 숨김 파일 표시).-h: 사람이 읽기 쉬운 형태 (10K,4.5M처럼 크기 표시).
cd(디렉터리 변경)- 사용법:
cd /var/log: 절대 경로로 이동.cd my_folder: 상대 경로로 이동.cd ..: 상위 디렉터리로 한 칸 이동.cd ~: 홈 디렉터리로 이동.cd -: 이전에 있던 디렉터리(직전 경로)로 이동.
- 사용법:
pwd(현재 작업 디렉터리 인쇄)- 설명: 현재 디렉터리의 전체 경로를 출력하여 "현재 위치"를 알려줍니다.
cp(복사)- 사용법:
cp [원본] [대상] - 파일 복사:
cp file.txt backup.txt - 디렉터리 복사: 반드시
-r(recursive, 재귀) 옵션을 사용해야 합니다:cp -r /my_app /backups
- 사용법:
mv(이동)- 설명: 파일이나 디렉터리를 이동시킵니다. 파일 이름 변경에도 사용됩니다.
- 이동:
mv file.txt /new_folder - 이름 변경:
mv old_name.txt new_name.txt
rm(제거)- 설명: 파일이나 디렉터리를 삭제합니다. "휴지통"이 없으므로 매우 주의해야 합니다!
- 파일 삭제:
rm file.txt - 빈 디렉터리 삭제:
rmdir my_folder - 디렉터리와 모든 내용 삭제:
rm -r my_folder - 확인 메시지 없이 강제 삭제:
rm -rf my_folder
mkdir(디렉터리 생성)- 사용법:
mkdir my_app - 팁:
-p(parents) 옵션을 사용하면 중첩된 디렉터리를 한 번에 생성할 수 있습니다:mkdir -p my_app/logs/2025
- 사용법:
🔎 III. 파일 내용 및 검색
파일을 보거나, 읽거나, 파일 또는 파일 내의 텍스트를 찾는 방법입니다.
cat(연결)- 설명: 파일의 전체 내용을 화면에 출력합니다. 짧은 파일에 유용합니다.
- 사용법:
cat config.yml
less- 설명: 대용량 파일을 한 번에 한 페이지씩 볼 수 있게 해주는 "페이저(pager)"입니다. 로그 파일처럼 긴 파일에는
cat보다 좋습니다. - 사용법:
less /var/log/syslog less내부: 화살표 키로 스크롤,/로 검색,q로 종료합니다.
- 설명: 대용량 파일을 한 번에 한 페이지씩 볼 수 있게 해주는 "페이저(pager)"입니다. 로그 파일처럼 긴 파일에는
head/tail- 설명: 파일의 처음(
head) 또는 마지막(tail) 부분을 보여줍니다. - 주요 사용법:
tail -f [파일 경로]-f(follow) 옵션은 로그 파일을 실시간으로 모니터링 하는 가장 좋은 방법입니다. 새로운 줄이 추가될 때마다 계속 출력해 줍니다.- 예시:
tail -f /var/log/my-app.log
- 설명: 파일의 처음(
grep(내용 검색)- 설명: 파일 내부 에서 텍스트 패턴을 검색합니다.
- 사용법:
grep "ERROR" /var/log/syslog - 주요 옵션:
-r(recursive): 디렉터리 안의 모든 파일을 재귀적으로 검색합니다.grep -r "DatabaseConnection" /opt/my_app-i: 대소문자를 무시합니다.-v: 일치하지 않는 줄을 보여줍니다.
find(파일 검색)- 설명: 파일과 디렉터리 자체 를 검색합니다 (내용이 아님).
- 사용법:
find [경로] -name "[패턴]" - 예시:
find /home/jerry -name "*.java"(Jerry의 홈 디렉터리에서 모든 Java 파일을 찾습니다).
🔐 IV. 권한 관리
누가 파일을 읽고, 쓰고, 실행할 수 있는지 제어하는 방법입니다.
sudo(슈퍼유저 권한으로 실행)- 설명: 단일 명령을 루트(관리자) 권한으로 실행합니다. 높은 수준의 권한이 필요한 작업을 수행하는 표준 방식입니다.
- 사용법:
sudo apt update(패키지 업데이트 시).
chmod(모드 변경)- 설명: 파일이나 디렉터리의 권한을 변경합니다.
- 8진수(숫자) 모드:
r(읽기) = 4,w(쓰기) = 2,x(실행) = 1.chmod 755 my_script.sh: (소유자: 7=rwx, 그룹: 5=r-x, 기타: 5=r-x).
- 심볼(문자) 모드:
chmod u+x my_script.sh: User(사용자)에게 execute(실행) 권한을 추가.chmod g-w file.txt: Group(그룹)의 write(쓰기) 권한을 제거.
chown(소유자 변경)- 설명: 파일의 사용자 및 그룹 소유권을 변경합니다.
- 사용법:
sudo chown jerry:developers /opt/my_app
📈 V. 시스템 및 성능 모니터링
하드웨어와 시스템의 상태를 확인하는 명령어입니다.
df(디스크 여유 공간)- 설명: 마운트된 파일 시스템(디스크)의 사용량을 보여줍니다.
- 주요 사용법:
df -h(human-readable, 사람이 읽기 쉬운 형태). "디스크가 꽉 찼는지" 확인할 때 씁니다.
du(디스크 사용량)- 설명: 특정 디렉터리와 그 하위 디렉터리들의 크기를 보여줍니다.
- 주요 사용법:
du -sh [경로]-s: Summary (총합계만 표시).-h: Human-readable.- 예시:
du -sh /var/log(log 디렉터리의 총 크기를 보여줍니다).
free- 설명: 메모리(RAM) 사용량을 보여줍니다.
- 주요 사용법:
free -h(human-readable). 총 메모리, 사용 중, 여유 공간, 스왑 메모리를 보여줍니다.
uptime- 설명: 시스템이 얼마나 오래 실행되었는지, 몇 명의 사용자가 로그인했는지, 그리고 시스템 부하 평균(load average) 을 보여줍니다. 부하 평균은 CPU 부하의 핵심 지표입니다.
dmesg- 설명: 커널 링 버퍼(커널 메시지)를 인쇄합니다. USB 드라이브 같은 하드웨어가 작동하지 않을 때 가장 먼저 확인해야 할 곳입니다.
journalctl- 설명:
systemd에 의해 관리되는 로그를 쿼리하는 최신 도구입니다. - 사용법:
journalctl -u [서비스 이름](예:journalctl -u nginx.service). - 팁:
journalctl -fu [서비스 이름](follow)은 서비스에 대한 최신tail -f입니다.
- 설명:
🌐 VI. 네트워크 관리 및 모니터링
ip- 설명: 네트워크 관리를 위한 최신 올인원(all-in-one) 도구입니다.
ip addr: 모든 인터페이스의 모든 IP 주소를 보여줍니다 (ifconfig를 대체).ip route: 라우팅 테이블을 보여줍니다 (route를 대체).
ss(소켓 통계)- 설명: 소켓 통계를 출력합니다. 구버전
netstat를 대체합니다. - 주요 사용법:
ss -tuln-t: TCP,-u: UDP,-l: 리스닝(대기 중인) 소켓,-n: 숫자 (이름 해석 안 함).
- 이 명령어는 "내 서버에 어떤 포트가 열려있지?" 를 확인하는 가장 좋은 방법입니다.
- 설명: 소켓 통계를 출력합니다. 구버전
ping- 설명: 원격 호스트에 도달할 수 있는지 확인합니다.
- 사용법:
ping google.com
dig/nslookup- 설명: DNS 서버에 쿼리하는 도구입니다.
- 사용법:
dig google.com(도메인의 IP 주소를 보여줍니다).
💻 VII. 사용자 및 서비스 관리
systemctl(SystemD 제어)- 설명: 현대 리눅스(RHEL 7+, Ubuntu 16+ 등)에서 가장 중요한 관리 도구입니다. 서비스(데몬)를 관리하는
systemdinit 시스템을 제어합니다. - 주요 사용법:
systemctl status [서비스 이름]: 서비스(예:nginx,docker,mysql)가 실행 중인지 확인.systemctl start [서비스 이름]: 서비스 시작.systemctl stop [서비스 이름]: 서비스 중지.systemctl restart [서비스 이름]: 서비스 재시작.systemctl enable [서비스 이름]: 부팅 시 서비스가 자동으로 시작되도록 설정.systemctl disable [서비스 이름]: 부팅 시 서비스가 자동으로 시작되지 않도록 설정.
- 설명: 현대 리눅스(RHEL 7+, Ubuntu 16+ 등)에서 가장 중요한 관리 도구입니다. 서비스(데몬)를 관리하는
apt/yum/dnf(패키지 관리)- 설명: 소프트웨어를 설치, 업데이트, 제거하는 방법입니다.
- Debian/Ubuntu:
sudo apt update,sudo apt install [패키지],sudo apt remove [패K지]. - RHEL/CentOS/Fedora:
sudo yum install [패키지]또는sudo dnf install [패키지].
파이핑(Piping)과 리디렉션(Redirection)은 리눅스에서 명령어와 파일 간의 데이터 흐름을 정밀하게 제어할 수 있게 해주는 두 가지 근본적인 개념입니다. 이 두 가지를 마스터하는 것은 단순한 명령어를 사용하는 수준에서 벗어나 강력하고 복잡한 쉘 스크립팅으로 나아가는 핵심입니다.
기본 개념: 표준 스트림과 파일 디스크립터
리눅스에서 실행하는 모든 명령어는 세 가지 표준 입출력(I/O) 스트림을 가지고 작동합니다.
- 표준 입력 (stdin): 명령어가 데이터를 받는 곳입니다. 기본값은 키보드입니다. 파일 디스크립터
0로 식별됩니다. - 표준 출력 (stdout): 명령어가 정상적인 결과를 보내는 곳입니다. 기본값은 터미널 화면입니다. 파일 디스크립터
1로 식별됩니다. - 표준 에러 (stderr): 명령어가 오류 메시지 를 보내는 곳입니다. 기본값은 터미널 화면입니다. 파일 디스크립터
2로 식별됩니다.
파이핑과 리디렉션은 이 세 가지 스트림의 기본 소스(source)와 대상(destination)을 변경하기 위해 사용하는 도구입니다.
파일로 리디렉션: > 와 < 연산자
리디렉션은 스트림의 대상을 화면에서 파일로 변경하거나, 소스를 키보드에서 파일로 변경합니다.
> (stdout 리디렉션 - 덮어쓰기)
이 연산자는 명령어의 표준 출력을 파일로 보냅니다. 파일이 이미 존재한다면 덮어씁니다.
# 파일 목록을 나열하되, 출력을 화면 대신 'file_list.txt'로 보냅니다.
ls -l > file_list.txt
>> (stdout 리디렉션 - 추가하기)
이 연산자는 표준 출력을 파일로 보냅니다. 파일이 이미 존재한다면, 새로운 출력을 파일 끝에 추가합니다.
# 로그 파일 끝에 "DONE" 메시지를 추가합니다.
echo "DONE" >> main.log
< (stdin 리디렉션)
이 연산자는 표준 입력을 리디렉션하여, (키보드 입력 대신) 파일의 내용을 명령어의 입력으로 받습니다.
# 'names.txt' 파일의 내용을 정렬하여 화면에 출력합니다.
sort < names.txt
2> (stderr 리디렉션)
이 연산자는 표준 에러 스트림(파일 디스크립터 2)을 파일로 보냅니다. 이는 오류 메시지를 정상적인 출력과 분리하는 데 매우 유용합니다.
# 명령어를 실행하고 *오류 메시지만* 'errors.log'에 저장합니다.
# 정상적인 출력(stdout)은 여전히 화면으로 갑니다.
find / -name "secret.txt" 2> errors.log
파이핑: | 연산자
파이핑은 파일이 아닌 명령어를 연결하는 데 사용됩니다. | 연산자는 왼쪽 명령어의 stdout을 받아서 오른쪽 명령어의 stdin으로 사용합니다. 이를 통해 명령어들을 체인처럼 연결할 수 있습니다.
간단한 파이프
# 1. 'ls -l'이 모든 파일을 자세히 나열합니다.
# 2. 'ls'의 출력이 'grep'의 입력으로 파이핑됩니다.
# 3. 'grep "Oct"`이 입력을 필터링하여 "Oct"를 포함하는 줄만 출력합니다.
ls -l | grep "Oct"
여러 파이프 연결하기
필요한 만큼 많은 명령어를 연결할 수 있습니다. 쉘의 진정한 힘이 여기서 나옵니다.
# 1. cat /var/log/syslog: 전체 로그 파일을 stdout으로 출력합니다.
# 2. | grep "ERROR": "ERROR"를 포함하는 줄만 필터링합니다.
# 3. | tail -n 10: 그 오류 줄들 중에서 마지막 10줄만 보여줍니다.
cat /var/log/syslog | grep "ERROR" | tail -n 10
고급 리디렉션 기술
1. 스트림 합치기 (2>&1)
이것은 가장 일반적이면서도 혼란스러운 관용구 중 하나입니다. &1은 파일 디스크립터 1(stdout)의 대상 을 의미합니다.
2>&1은 "stderr(스트림 2)를 stdout(스트림 1)이 현재 가고 있는 곳과 동일한 곳으로 리디렉션하라"는 의미입니다.
- command > output.log 2>&1
이것은 모든 출력 (stdout과 stderr 모두)을 단일 파일로 캡처하는 표준적인 방법입니다.
> output.log: 먼저,stdout이output.log로 리디렉션됩니다.2>&1: 그런 다음,stderr가stdout이 가고 있는 곳(즉,output.log)과 _같은 곳_으로 리디렉션됩니다.- 참고: 순서가 중요합니다!
command 2>&1 > output.log는 동일하게 작동하지 않습니다.
- command &> output.log 이것은 > output.log 2>&1과 정확히 동일한 작업을 수행하는 최신(Bash 전용) 단축키입니다.
2. 출력 음소거 (/dev/null)
/dev/null은 "비트 버킷"이라고도 불리는 특수 파일로, 자신에게 쓰여지는 모든 것을 버립니다.
- 모든 출력(stdout 및 stderr) 음소거:
command > /dev/null 2>&1
- 오류 메시지만 음소거:
command 2> /dev/null
3. 출력 분할 (tee)
tee 명령어(배관의 T자형 분배기에서 이름을 따옴)는 stdin에서 읽어와서 두 곳, 즉 stdout과 파일에 동시에 씁니다. 명령어의 출력을 화면으로 보면서 동시에 로그 파일로 저장하고 싶을 때 완벽합니다.
# 1. 'ls -l'이 출력을 'tee'로 파이핑합니다.
# 2. 'tee'가 그 출력의 복사본을 'file_list.txt'에 저장합니다.
# 3. 'tee'는 또한 출력을 자신의 stdout으로 통과시킵니다.
# 4. 그 stdout이 'wc -l'의 입력으로 파이핑되어 줄 수를 셉니다.
ls -l | tee file_list.txt | wc -l
고급 입력 리디렉션
1. Here Document (<<)
"Here Document"는 스크립트 내에서 바로 명령어에 여러 줄의 입력을 타이핑할 수 있게 해줍니다. 필수적인 스크립팅 도구입니다.
# '<< EOF'와 'EOF' 사이의 모든 텍스트를 'cat' 명령어의 stdin으로 공급합니다.
# 'EOF'는 단지 구분자일 뿐이며, 어떤 단어든 사용할 수 있습니다.
cat << EOF
이것은 첫 번째 줄입니다.
이것은 두 번째 줄입니다.
날짜는 $(date)입니다.
EOF
- 참고: 변수(
$USER)와 명령어($(date))는 확장(실행)됩니다. 이를 방지하려면 구분자를 따옴표로 묶으세요:cat << 'EOF'.
2. Here String (<<<)
단일 문자열 입력을 위한 Here Document의 더 간단한 버전입니다.
# "hello world" 문자열을 'wc -c' 명령어의 stdin으로 공급합니다.
wc -c <<< "hello world"
3. 프로세스 치환 (<(...) 및 >(...))
명령어의 출력 을 임시 파일인 것처럼 취급할 수 있게 해주는 고급 기능입니다.
-
<(command) (입력): 명령어의 stdout을 포함하는 임시 파일처럼 작동합니다.
임시 파일을 만들지 않고 두 명령어의 출력을 비교하기 위해 diff와 함께 가장 많이 사용됩니다.
# file1.txt의 정렬된 내용과 file2.txt의 정렬된 내용을 비교합니다.
diff <(sort file1.txt) <(sort file2.txt)
-
(command) (출력): 쓰기 가능한 임시 파일처럼 작동하며, 이 파일에 쓰인 데이터는 해당 명령어의 stdin으로 파이핑됩니다.
stdout을 여러 프로세스로 분할하기 위해 tee와 함께 자주 사용됩니다.
# 'ls' 출력을 두 개의 다른 'grep' 프로세스로 동시에 보냅니다.
ls -l | tee >(grep "Oct") >(grep "Nov")
📄 I. 파일 내용 변경하기
파일 내용을 변경하는 방법에는 크게 두 가지가 있습니다: (수동 변경을 위한) 대화형 편집기와 (스크립트 작성을 위한) 비대화형 명령어입니다.
1. 대화형 편집기 (수동 편집)
이 명령어들은 텍스트를 입력할 수 있는 전체 화면 편집기를 엽니다.
nano (초보자 친화적 편집기)
- 설명: 간단하고 사용하기 쉬운, 모드가 없는 편집기입니다. 화면 하단에 명령어들이 표시됩니다.
- 사용법:
nano my_file.txt - 주요 조작키:
Ctrl+O: Write Out (저장). 파일 이름을 확인받습니다.Ctrl+X: Exit (종료). 저장되지 않은 변경 사항이 있으면 저장할지 묻습니다.
vim / vi (강력한 고급 편집기)
- 설명: 매우 효율적이지만 복잡한 모드(modal) 편집기입니다. 거의 모든 리눅스 시스템에 기본 설치되어 있습니다.
- 사용법:
vim my_file.txt - 핵심 개념: 모드
- 일반 모드 (Normal Mode): 기본 모드입니다. 텍스트를 바로 입력할 수 없으며, 키를 사용해 명령어(
d로 삭제,y로 복사 등)를 내립니다. - 입력 모드 (Insert Mode): 텍스트를 입력하는 모드입니다.
- 일반 모드 (Normal Mode): 기본 모드입니다. 텍스트를 바로 입력할 수 없으며, 키를 사용해 명령어(
- 기본 작업 흐름:
i키를 눌러 Insert(입력) 모드로 들어갑니다.- 텍스트를 입력합니다.
Esc키를 눌러 일반 모드로 돌아옵니다.:wq를 입력하고 Enter를 누릅니다.:: 명령행 모드로 진입.w: Write (저장).q: Quit (종료).
- 저장하지 않고 종료하려면:
:q!
2. 비대화형 명령어 (스크립트용)
이 명령어들은 편집기를 열지 않고 파일을 수정하는 데 사용됩니다.
echo 와 리디렉션
- 설명:
echo명령어는 문자열을 표준 출력(stdout)으로 인쇄합니다. 이 출력을 파일로 보내기 위해 리디렉션 연산자(>와>>)를 사용합니다. - 덮어쓰기 (
>): 파일의 전체 내용을 대체합니다.
# file.txt의 내용을 "Hello World"로 완전히 덮어씁니다.
echo "Hello World" > file.txt
- 추가하기 (
>>): 파일의 끝에 새로운 내용을 추가합니다.
# file.txt의 끝에 "This is a new line"을 추가합니다.
echo "This is a new line" >> file.txt
sed (스트림 편집기)
- 설명: 커맨드 라인에서 파일 내부의 텍스트를 찾아 바꾸기 위한 주된 도구입니다.
- 작동 방식:
sed는 파일을 읽고, (치환과 같은) 명령을 적용한 뒤, 수정된 결과를 표준 출력으로 인쇄합니다. - 기본 문법:
sed 's/찾을내용/바꿀내용/g' 파일명s: 치환(substitute) 명령어./찾을내용/: 검색할 텍스트 (정규 표현식)./바꿀내용/: 대체할 텍스트.g: 전역(Global) 플래그. 한 줄에서 첫 번째 일치 항목만 바꾸는 게 아니라 모든 일치 항목을 바꿉니다.
- 중요: 원본 파일 수정 (-i) 기본적으로 sed는 원본 파일을 변경하지 않고 화면에만 출력합니다. 변경 사항을 파일에 다시 저장하도록 하려면, -i (in-place) 플래그를 사용해야 합니다.
- 예시:
# config.txt에 "port = 8080"이라는 줄이 있다고 가정
# 이것은 터미널에 변경된 내용만 출력합니다:
sed 's/port = 8080/port = 9000/g' config.txt
# 이것이 *실제로* 파일을 수정합니다:
sed -i 's/port = 8080/port = 9000/g' config.txt
🏃 II. 스크립트 제어하기
스크립트를 실행 가능하게 만들고 실행을 관리하는 방법입니다.
1. 스크립트 실행 가능하게 만들기
스크립트를 "제어"하기 전에, 실행 가능해야 합니다.
- 설명: 운영체제에 이 파일이 실행될 수 있는 프로그램임을 알려야 합니다.
- 명령어:
chmod(change mode) - 사용법:
# 사용자(u)에게 스크립트를 실행(x)할 권한을 부여합니다.
chmod u+x my_script.sh
# 모든 사람에게 실행 권한을 주는 일반적인 단축키:
chmod +x my_script.sh
2. 스크립트 실행하기
- 포그라운드 (기본): 스크립트가 실행되고, 터미널은 스크립트가 끝날 때까지 기다립니다.
# './'는 쉘에게 현재 디렉터리에서 찾으라고 알립니다.
./my_script.sh
-
인터프리터를 지정하여 실행할 수도 있습니다:
bash my_script.sh(이 경우chmod +x가 필요 없음). -
백그라운드 (
&): 스크립트가 백그라운드에서 실행되며, 터미널 프롬프트를 즉시 반환하여 계속 작업할 수 있습니다.
./my_script.sh &
-
문제점: 터미널에서 로그아웃하면 스크립트가 중지됩니다.
-
지속적으로 실행하기 (
nohup):- 설명:
nohup(No Hang Up)은 스크립트가 "hang up(연결 끊김)" 신호를 무시하도록 만드는 명령어입니다. 이를 통해 로그아웃한 후에도 스크립트가 계속 실행될 수 있습니다. - 사용법: 거의 항상
&및 출력 리디렉션과 함께 사용됩니다.
- 설명:
# 장기 실행 스크립트를 실행하는 표준적이고 견고한 방법:
# 1. 'nohup': 로그아웃을 무시하도록 함.
# 2. '> script.log': 표준 출력을 로그 파일로 리디렉션.
# 3. '2>&1': 표준 에러(2)를 표준 출력(1)이 가는 곳과 같은 곳으로 리디렉션.
# 4. '&': 백그라운드에서 실행.
nohup ./my_script.sh > script.log 2>&1 &
3. 실행 중인 스크립트 관리 (작업 제어)
Ctrl+C: (인터럽트) 포그라운드 프로세스를 종료합니다.Ctrl+Z: (일시 중지) 포그라운드 프로세스를 일시 중지하고 백그라운드로 보냅니다.jobs: 현재 터미널에서 시작한 모든 작업(프로세스) 목록과 상태(예: Running, Stopped)를 보여줍니다.
[1]+ Stopped ./my_script.sh
[2]- Running ./another_script.sh &
fg(포그라운드): 백그라운드나 중지된 작업을 포그라운드로 가져옵니다.
# 작업 [1]을 포그라운드로 가져옴
fg %1
bg(백그라운드): 중지된 작업을 백그라운드에서 다시 실행합니다.
# 작업 [1]을 백그라운드에서 재개
bg %1
kill: 작업을 종료합니다.jobs의 작업 ID 또는ps aux의 **프로세스 ID(PID)**를 사용할 수 있습니다.
# 작업 [2] 종료
kill %2
# PID로 프로세스 종료 (예: 4512)
kill 4512
4. 스크립트 스케줄링 (cron)
- 설명:
cron데몬은 특정 시간(예: 매일 밤, 주 1회)에 스크립트를 실행하기 위한 내장 스케줄러입니다. - 사용법:
crontab -e를 실행하면 규칙을 추가할 수 있도록 "crontab"(cron 테이블) 파일이 편집기에서 열립니다. - 형식:
# ┌───────────── 분 (0 - 59)
# │ ┌───────────── 시 (0 - 23)
# │ │ ┌───────────── 일 (1 - 31)
# │ │ │ ┌───────────── 월 (1 - 12)
# │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일=0 또는 7)
# │ │ │ │ │
# * * * * * /path/to/command
- 예시:
0 3 * * * /home/user/backup.sh- 의미: 매일 오전 3시 0분에
/home/user/backup.sh실행.
- 의미: 매일 오전 3시 0분에
*/15 * * * * /home/user/check_disk.sh- 의미: 매 15분마다
/home/user/check_disk.sh실행.
- 의미: 매 15분마다
sed와 awk는 텍스트 처리를 위한 리눅스/유닉스의 가장 강력하고 근본적인 커맨드 라인 유틸리티 두 가지입니다. 이 둘은 종종 복잡한 데이터 조작을 수행하기 위해 함께 사용됩니다.
간단히 말해, sed는 주로 텍스트를 찾고 바꾸는 데 사용되는 스트림 편집기입니다. awk는 특히 열(column) 단위의 데이터를 추출하고 형식을 지정하는 데 사용되는 패턴 매칭 및 처리 언어입니다.
sed (스트림 편집기)
sed는 Stream EDitor의 약자입니다. 스트림(파일 또는 파이프 입력)에서 텍스트를 한 줄씩 읽고, 각 줄에 규칙이나 명령을 적용한 다음, 그 결과를 표준 출력으로 보냅니다.
명시적으로 지시하지 않는 한 원본 파일을 수정하지 않습니다.
👕 비유
sed를 조립 라인의 "찾아 바꾸기" 로봇으로 생각하세요. 텍스트의 각 줄이 컨베이어 벨트를 따라오면, 로봇은 ("모든 '사과'를 '오렌지'로 바꾸기"와 같은) _하나_의 특정 지시를 수행하고, 그 줄을 출력으로 보냅니다.
핵심 개념: 치환 명령어 (s)
sed의 가장 일반적인 용도는 치환입니다. 문법은 다음과 같습니다.
sed 's/찾을패턴/바꿀내용/플래그'
s: 치환(substitute) 명령어./찾을패턴/: 찾을 패턴 (정규 표현식)./바꿀내용/: 바꿀 텍스트./플래그: 선택적 플래그. 가장 일반적인 것은g(global)이며, 줄에서 첫 번째 일치 항목뿐만 아니라 모든 일치 항목을 바꿉니다.
실제 예제
fruit.txt라는 예제 파일을 사용해 보겠습니다.
apple,red,1
banana,yellow,2
apple,green,3
- 기본 치환 (찾아 바꾸기)
각 줄에서 첫 번째 "apple"을 찾아 "orange"로 바꿉니다.
sed 's/apple/orange/' fruit.txt
출력:
orange,red,1
banana,yellow,2
orange,green,3
- 전역 치환 (/g)
만약 한 줄에 "apple apple"이 있었다면, 첫 번째 명령어는 첫 번째 것만 바꿨을 것입니다. g 플래그는 모든 것을 바꿉니다.
sed 's/apple/orange/g' fruit.txt
- 원본 파일 수정 (-i) - 파일 직접 수정
이것은 sed가 디스크의 파일을 실제로 변경하도록 만드는 방법입니다. 데이터가 파괴될 수 있으니 주의하세요.
# 이 명령어는 아무것도 출력하지 않고, fruit.txt 파일을 직접 수정합니다.
sed -i 's/apple/orange/g' fruit.txt
- 줄 삭제 (/d)
패턴과 일치하는 줄을 삭제할 수 있습니다.
# "banana"를 포함하는 모든 줄을 삭제합니다.
sed '/banana/d' fruit.txt
출력: (이전 단계에서 orange로 변경되었다고 가정)
orange,red,1
orange,green,3
awk (Aho, Weinberger, and Kernighan)
awk는 세 명의 저자 이름에서 따왔습니다. 단순한 명령어가 아니라, 데이터 추출 및 보고를 위해 설계된 완전한 프로그래밍 언어입니다.
awk의 주된 강점은 텍스트를 레코드(보통 줄)와 필드(보통 공백이나 구분 기호로 분리된 열)의 컬렉션으로 자동 처리한다는 것입니다.
📊 비유
awk를 터미널을 위한 스마트 스프레드시트 프로그램으로 생각하세요. 파일을 한 줄씩(행) 읽고 각 줄을 자동으로 열로 분리합니다. 그런 다음 계산을 수행하거나, 행을 필터링하거나, 열을 재배열할 수 있습니다.
핵심 개념: pattern { action } 문법
모든 awk 명령어는 이 구조를 따릅니다.
awk 'pattern { action }'
pattern: 확인할 조건 (WHERE절과 유사). 줄이 패턴과 일치하면 액션이 수행됩니다. 패턴이 생략되면 모든 줄 에 대해 액션이 실행됩니다.{ action }: 실행할 코드 (SELECT나PRINT문과 유사). 액션이 생략되면, 기본 액션은 일치하는 전체 줄을 출력하는 것입니다.
내장 변수
awk는 각 필드에 대해 특별한 변수를 제공합니다.
$0: 전체 줄 (레코드).$1: 첫 번째 필드 (열).$2: 두 번째 필드.- ...
NF: 현재 줄의 필드 수(Number of Fields).NR: 현재 줄 번호( Number of Record).
실제 예제
scores.txt라는 예제 파일을 사용해 보겠습니다.
user level score
alice 10 500
bob 5 1500
charlie 12 800
- 특정 열 출력하기
모든 줄에 대해 사용자 이름($1)과 점수($3)를 출력합니다.
awk '{ print $1, $3 }' scores.txt
출력:
user score
alice 500
bob 1500
charlie 800
- 행 필터링하기 (패턴 사용)
점수(필드 3)가 1000보다 큰 경우에만 전체 줄($0)을 출력합니다.
awk '$3 > 1000' scores.txt
출력:
bob 5 1500
- 구분 기호 사용 (-F) 및 계산
쉼표로 구분된 fruit.txt 파일을 사용해 봅시다.
awk -F',' '{ $4 = $3 * 10; print $0 }' fruit.txt
-F',': 필드(Field) 구분 기호를 쉼표로 설정합니다.{ $4 = $3 * 10; print $0 }: 3번째 필드에 10을 곱하여 새로운 4번째 필드($4)를 만들고, 수정된 전체 줄을 출력합니다.
출력: (이전 단계에서 orange로 변경되었다고 가정)
orange,red,1 10
banana,yellow,2 20
orange,green,3 30
- BEGIN 과 END 블록
awk는 어떤 줄도 처리하기 전과 모든 처리가 끝난 후에 코드를 실행할 수 있습니다. 이는 헤더나 총계를 출력하는 데 완벽합니다.
# 'score' 열을 합산합니다.
awk 'BEGIN { sum = 0 }
$3 ~ /^[0-9]+$/ { sum += $3 }
END { print "Total Score:", sum }' scores.txt
BEGIN:sum을 0으로 초기화합니다.$3 ~ /^[0-9]+$/: 필드 3이 숫자인지 확인하는 패턴 (헤더 행 건너뛰기).{ sum += $3 }: 액션: 점수를sum에 더합니다.END: 모든 줄을 처리한 후, 최종 합계를 출력합니다.
출력:
Total Score: 2800
sed vs. awk
| 특징 | sed (스트림 편집기) | awk (패턴/액션 언어) |
|---|---|---|
| 주요 용도 | 치환 (찾아 바꾸기), 간단한 편집 | 데이터 추출 (열 단위), 필터링, 계산 |
| 핵심 개념 | 텍스트 스트림에 명령어 적용 | 텍스트를 레코드와 필드로 처리 |
| 복잡성 | 단순함, 기본 작업에 더 빠름 | 더 강력함, 완전한 스크립팅 언어 |
| 비유 | 찾아 바꾸기 로봇 | 스마트한 터미널 스프레드시트 |
| 일반적 사용 | sed 's/foo/bar/g' |
awk '{ print $1, $3 }' |
references